package com.example.lenovo.threadlock;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import com.example.lenovo.threadlock.ReentrantLock.ConsumerReentrantLock;
import com.example.lenovo.threadlock.ReentrantLock.ProducerReentrantLock;
import com.example.lenovo.threadlock.lock_util.Consumer;
import com.example.lenovo.threadlock.lock_util.Produce;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button mTv_kaiqi;
    public static final Object obj = new Object();
    private Button mbt_reentrantLock;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init_view();
        init_listener();



    }

    private void init_listener() {
        mTv_kaiqi.setOnClickListener(this);
        mbt_reentrantLock.setOnClickListener(this);
    }

    private void init_view() {
        mTv_kaiqi = (Button) findViewById(R.id.bt_kaiqi);
        mbt_reentrantLock = (Button) findViewById(R.id.bt_ReentrantLock);
    }
    // 在并发量比较小的情况下，使用synchronized是个不错的选择，但是在并发量比较高的情况下，其性能下降很严重，此时ReentrantLock是个不错的方案。
    @Override
    public void onClick(View view) {
        switch (view.getId())
        {
            case R.id.bt_kaiqi:
                // 线程Produce和线程Consumer共用一个线程锁obj
                // 因为两个线程方法都使用了synchronized,都是同步线程。
                // 在线程里使用MainActivity.obj.wait();意思是释放占有的对象锁。
                // 释放后,会执行Consumer的线程方法,执行 MainActivity.obj.notify();该方法会唤醒因为调用对象的wait()而等待的线程。
                // 会释唤醒对方的线程。
                new Thread( new Produce()).start();
                new Thread( new Consumer()).start();
                break;
            case R.id.bt_ReentrantLock:
                Lock lock = new ReentrantLock();

                ConsumerReentrantLock consumer = new ConsumerReentrantLock(lock);
                ProducerReentrantLock producer = new ProducerReentrantLock(lock);

                new Thread(consumer).start();
                new Thread( producer).start();

        }
    }
}
